//////////////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2014-2015, Egret Technology Inc.
//  All rights reserved.
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the Egret nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
//  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
//  IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA,
//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////////////

module egret.native {

    var surfacePool:NativeSurface[] = [];

    /**
     * @private
     */
    export class OpenGLFactory implements sys.SurfaceFactory {

        /**
         * @private
         */
        public constructor() {
            sys.sharedRenderContext = this.create().renderContext;
            for (var i = 0; i < 3; i++) {
                surfacePool.push(this.create());
            }
        }

        /**
         * @private
         * 从对象池取出或创建一个新的Surface实例
         * @param useOnce 表示对取出实例的使用是一次性的，用完后立即会释放。
         */
        public create(useOnce?:boolean):NativeSurface {
            var surface:NativeSurface = (useOnce || surfacePool.length > 3) ? surfacePool.pop() : null;
            if (!surface) {
                surface = this.createSurface(new NativeSurface());
            }
            surface.$reload();
            return surface;
        }

        /**
         * @private
         * 释放一个Surface实例
         * @param surface 要释放的Surface实例
         */
        public release(surface:NativeSurface):void {
            if (!surface) {
                return;
            }
            //surface.$dispose();
            //surface.width = surface.height = 1;
            surfacePool.push(surface);
        }

        /**
         * @private
         */
        private createSurface(canvas:NativeSurface):NativeSurface {
            var context = canvas.renderContext;
            context.surface = canvas;

            return <NativeSurface><any>canvas;
        }

    }
}